//用来创建http服务器的
const http = require('http');
//用来解析url地址
const url = require('url');
//用来读写文件的
const fs = require('fs');
//用来处理路径的
const path = require('path');
// 创建用户列表
let users = [];
// 创建HTTP服务器并定义请求处理逻辑
const server = http.createServer(async (req, res) => {
  // 解析请求URL req.url http://localhost:3000/users?id=1
  const parsedUrl = url.parse(req.url, true);
  const { pathname } = parsedUrl;///users
  const { id } = parsedUrl.query;//{id:1} id=1
  // 判断请求路径并处理
  if (pathname === '/') {//http://localhost:3000/  http://localhost:3000
    // 如果请求根路径，返回'hello world' 写入响应体，并且结束响应
    res.end('hello world');
  } else if (pathname === '/users') {//如果请求的是用户信息的话
    // 如果请求用户列表，根据请求方法进行处理
    switch (req.method) {
      case 'POST':
        // 如果是POST请求，创建新用户并添加到列表
        const newUser = await getRequestBody(req);
        console.log('POST请求体',newUser)
        newUser.id = users.length + 1;
        users.push(newUser);
        res.statusCode = 201;//增加实体
        //指定响应体的格式为普通文档 ，编码为utf8编码，响应体时有中文的话需要加入编码的设置
        res.setHeader('Content-Type','text/plain; charset=utf8');
        //res.end(JSON.stringify({msg:'Created'}));
        res.end('Created');
        break;
      case 'DELETE':
        // 如果是DELETE请求，从用户列表中移除指定的用户
        if (id) {
          users = users.filter(user => user.id !== parseInt(id));
          res.end('deleted');
        }
        break;
      case 'PUT':
        // 如果是PUT请求，更新用户列表中的指定用户信息
        if (id) {
          const updateUser = await getRequestBody(req);
          users = users.map(user => user.id === parseInt(id) ? {
            ...user,
            ...updateUser
          } : user);
          res.end('updated');
        }
        break;
      case 'GET':
        // 如果是GET请求，返回指定的用户信息或整个用户列表
        if (id) {
          const user = users.find(user => user.id === parseInt(id));
          res.end(JSON.stringify(user));
        } else {
          res.end(JSON.stringify(users));
        }
        break;
      default:
        // 如果请求方法不被支持，返回错误信息
        res.end('sorry');
        break;
    }
  } else {
    // http://localhost:3000/2.users.html
    // 如果请求其他路径，尝试作为文件路径处理并返回文件内容
    const ext = path.extname(pathname);// .html
    //用当前的文件夹路径加上文件路径获取文件的的绝对路径
    //C:\aproject\aa2023_02\JS部分\day0523\2.users.html
    const filePath = path.join(__dirname, pathname);
    if (ext === '.html' || ext === '.js' || ext === '.css') {
      // 如果是html、js或css文件，尝试读取并返回
      fs.readFile(filePath, 'utf8', (err, data) => {
        if (err) {
          // 如果文件不存在，返回404错误
          res.statusCode = 404;
          res.end('Not found');
        } else {
          // 如果文件存在，设置正确的Content-Type并返回文件内容
          res.setHeader('Content-Type', getContentType(ext));
          res.end(data);
        }
      });
    } else {
      // 如果路径不是文件路径或用户列表，返回错误信息
      res.statusCode=404;
      res.end('Invalid path');
    }
  }
});
// 根据文件扩展名返回对应的Content-Type
function getContentType(ext) {
  switch (ext) {
    case '.html':
      return 'text/html';
    case '.js':
      return 'text/javascript';
    case '.css':
      return 'text/css';
    default:
      // 当无匹配扩展名时，返回通用的类型
      return 'text/plain';
  }
}
// 处理请求体，解析为JSON对象
function getRequestBody(req) {
  return new Promise(resolve => {
    // 初始化请求体字符串
    let body = '';
    req.on('data', chunk => {
      // 当有数据到来时，添加到请求体字符串
      body += chunk;
    });
    req.on('end', () => {
      // 当所有数据接收完毕，解析为JSON并返回
      resolve(JSON.parse(body));
    });
  });
}
// 启动服务器并监听3000端口
server.listen(3000, () => console.log(`Server is listening on port 3000`));